﻿using System;
using System.Collections.Generic;
using System.Data.Services;
using System.Data.Services.Common;
using System.IO;
using System.Linq;
using System.ServiceModel.Web;
using System.Web;
using System.Web.Hosting;
using MvcGraffiti.Core;
using MvcGraffiti.Models;

namespace MvcGraffiti
{
	[JSONPSupportBehavior]
	public class Graffitis : DataService<MvcGraffitiEntities>
    {
        // このメソッドは、サービス全体のポリシーを初期化するために、1 度だけ呼び出されます。
        public static void InitializeService(DataServiceConfiguration config)
        {
            // TODO: 表示や更新などが可能なエンティティ セットおよびサービス操作を示す規則を設定してください
            // 例:
            config.SetEntitySetAccessRule("*", EntitySetRights.All);
			config.SetServiceOperationAccessRule("GetSessions", ServiceOperationRights.AllRead);
            config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
        }

		private void DeleteThumbnail(int id)
		{
			var path = HttpContext.Current.Server.MapPath("~/App_Data/Thumbnails/" + id + ".png");
			if (File.Exists(path))
				File.Delete(path);
		}

		// Queryに介入するためのQueryInterceptor属性もあるよ。
		[ChangeInterceptor("Graffitis")]
		public void DeleteGraffiti(Graffiti graffiti, UpdateOperations operations)
		{
			// サムネイルを消しましょか
			if (operations != UpdateOperations.Delete) 
				return;

			DeleteThumbnail(graffiti.Id);
		}

        [ChangeInterceptor("Strokes")]
        public void UpdateStrokes(Stroke stroke, UpdateOperations operations)
        {
            // サムネイルを消しましょか
			DeleteThumbnail(stroke.GraffitiId);
        }

		[WebGet]
		public IQueryable<string> GetSessions(int id)
		{
			return (from s in CurrentDataSource.Strokes
			        where s.GraffitiId == id
			        select s.Sessions.Name).Distinct();
		}
    }
}
